package com.apexsoft.front.common.utils;

import java.text.DecimalFormat;
import java.util.Map;

import org.apache.commons.lang.StringUtils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

/**
 * 字符串通用工具类
 * 
 * @author hwt
 */
public class StringUtil {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
//		String strArr = "123aaaa????中方";
//		System.out.println(isChinese(strArr));
		System.out.println(isNum("�"));
	}

	// 根据Unicode编码完美的判断中文汉字和符号
	private static boolean isChinese(char c) {
		Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
		if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
				|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
				|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
				|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B
				|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
				|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS
				|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION) {
			return true;
		}
		return false;
	}

	// 完整的判断中文汉字和符号
	public static boolean isChinese(String strName) {
		char[] ch = strName.toCharArray();
		for (int i = 0; i < ch.length; i++) {
			char c = ch[i];
			if (isChinese(c)) {
				return true;
			}
		}
		return false;
	}
	
	/**
	 * 数据格式化 (每三位以逗号进行分隔,保留两位有效小数)
	 * @param str
	 * @return
	 */
	public static String numberFormatTwo(String str){
		DecimalFormat df = new DecimalFormat(",##0.00");  
		if(StringUtils.isNotBlank(str)){
			return df.format(Double.valueOf(str));
		}
		return "";
	}
	
	/**
	 * 数据格式化 (每三位以逗号进行分隔,保留三位有效小数)
	 * @param str
	 * @return
	 */
	public static String numberFormatThree(String str){
		DecimalFormat df = new DecimalFormat(",##0.000");  
		if(StringUtils.isNotBlank(str)){
			return df.format(Double.valueOf(str));
		}
		return "";
	}
	
	/**
	 * 数据格式化 (每三位以逗号进行分隔)
	 * @param str
	 * @return
	 */
	public static String numberFormatToLocaleInt(String str){
		DecimalFormat df = new DecimalFormat(",###");   
		return df.format(Double.valueOf(str));
	}
	
	/**
	 * 数据格式化 (百分比)
	 * @param str
	 * @return
	 */
	public static String numberFormatToPercent(String str){
		DecimalFormat df = new DecimalFormat("00.00%");   
		return df.format(Double.valueOf(str));
	}
	
	/**
	 * 数据格式化（根据数据大小转换完对应单位）
	 * @param str
	 * @return
	 */
	public static String numberFormatToDW(String str){
		if(StringUtils.isNotBlank(str)){
			Double strTmp = Double.parseDouble(str);
			if (strTmp / 10000 / 10000 > 0.999) {
				str = String.valueOf(new DecimalFormat("###,###,###.00").format(strTmp / 10000 / 10000)) + "亿";
			} else if (strTmp / 10000 > 0.999) {
				str = String.valueOf(new DecimalFormat("###,###,###.00").format(strTmp / 10000)) + "万";
			} else {
				if(strTmp==0){
					str = "0";
				} else {
					str = String.valueOf(new DecimalFormat("###,###,###.00").format(strTmp));
				}
			}
			
			if(strTmp==0){
				str = "0";
			} else {
				str = String.valueOf(new DecimalFormat("###,###,###.00").format(strTmp / 10000)) + "万";
			}
		}
		return str;
	}
	
	/**
	 * 数据格式化（转换为万）
	 * @param str
	 * @return
	 */
	public static String numberFormatToW(String str){
		if(StringUtils.isNotBlank(str)){
			Double strTmp = Double.parseDouble(str);
			if(strTmp==0){
				str = "0";
			} else {
				strTmp = (Math.floor(strTmp/100))/100;//处理format自己向上取整问题
				str = String.valueOf(new DecimalFormat("###,###,###.00").format(strTmp));
				if (strTmp<1) {
					str = "0" + str; 
				}
			}
		}
		return str;
	}
	
	/**
	 * 数据格式化（转换为万）
	 * @param str
	 * @return
	 */
	public static String numberFormatToWNotNull(String str){
		if(StringUtils.isNotBlank(str)){
			Double strTmp = Double.parseDouble(str);
			if(strTmp==0){
				str = "0";
			} else {
				strTmp = (Math.floor(strTmp/100))/100;//处理format自己向上取整问题
				str = String.valueOf(new DecimalFormat("###,###,###.00").format(strTmp));
				if (strTmp<1) {
					str = "0" + str; 
				}
			}
		}else{
			str = "";
		}
		return str;
	}
	
	/**
	 * 根据字段编码转换成对应的名称
	 * @param codeName 定义的编码与名称的对应Map; code 字段编码
	 * @return
	 */
	public static String getNameByCode(Map<String,String> codeNameMap,String code) {
		String name = "";
		try {
			if(codeNameMap.get(code)!=null){
			  name = codeNameMap.get(code);
			}
		} catch (Exception e) {

		}
		return name;
	}
	/**
	 * ASCII转换为字符串
	 * @param value
	 * @return
	 */
	 public static String asciiToString(String value){
	 	  String[] charArr2 = value.trim().split("");
	 	  String[] charArr = new String[charArr2.length-1];
	 	  //删除第一个空格元素
	 	  for (int i = 1; i < charArr2.length; i++) {
	 		 charArr[i-1] = charArr2[i];
	 	  }
	 	  //循环奇偶对换
	 	  for (int i = 0; i < charArr.length; i++) {
			  if(i%2==0 && i < charArr.length-1){
				  String temp = charArr[i];
				  charArr[i] = charArr[i+1];
				  charArr[i+1] = temp;			
			  }
		  }
		  StringBuffer sbu = new StringBuffer();
		  for (int i = 0; i < charArr.length; i=i+3) {
			  sbu.append((char) Integer.parseInt(charArr[i]+""+charArr[i+1]+""+charArr[i+2]));
		  }
		  return sbu.toString();
	 }
	 
	 
	 public static String seperateError(String value){
		 if(value==null||value.equals("")){
			 return "";
		 }else if(value.indexOf("msg:")>0){
			 return value.split("msg:")[1];
		 }else{
			 return value;
		 }
	 }
	 
	 /**
	  * 如果value为null，则把value转换成空字符串
	  * @param value 字符串
	  * @return
	  */
	 public static String toNotNullStr(String value) {
		 return value == null? "": value;
	 }
	 
	 /**
	  * 字符串转换成JSON对象
	  * @param value 字符串
	  * @return 失败返回null
	  */
	 public static JSONObject str2Json(String value) {
		 try {
			 return JSON.parseObject(value);
		 } catch (Exception e) {
			 return null;
		 }
	 }
	 
	 /**
	  * 统计字符串包含几个子字符串的数量
	  * @param str
	  * @param des
	  * @return
	  */
	 public static int countContainStringNum(String str,String des){
		 int cnt = 0;
         int offset = 0;
         while((offset = str.indexOf(des, offset)) != -1){
             offset = offset + des.length();
             cnt++;
         }
	     return cnt;
	 }
	 
	 /**
	  * 判断字符串是否为数字（包括有正负号、小数点）
	  * @param str
	  * @return
	  */
	 public static boolean isNum(String str){
			return str.matches("^[-+]?(([0-9]+)([.]([0-9]+))?|([.]([0-9]+))?)$");
	}
	 
}